package com.hu.common.domain.dto;

import com.hu.common.enums.PreEmpTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.util.Map;

/**
 * 预入职员工基本信息DTO;
 *
 * @author : 林志强
 * @date : 2024-11-19
 */
@Data
@ApiModel(value = "PreEmpBaseInfoDTO", description = "预入职员工基本信息DTO")
public class PreEmpBaseInfoDTO {

    /** 主键 */
    @ApiModelProperty(value = "主键; ", name = "id")
    private String id;

    @ApiModelProperty(value = "图片信息，以图片类型作键; ", name = "imgs")
    private Map<String, String> imgs;

    /** 身份证人像面 */
    @ApiModelProperty(value = "身份证人像面; ", name = "idCardPsn")
    @Length(max = 1024)
    private String idCardPsn;

    /** 身份证国徽面 */
    @ApiModelProperty(value = "身份证国徽面; ", name = "idCardPhoto")
    @Length(max = 1024)
    private String idCardPhoto;

    /** 身份证复印件（文件表ID，多个用英文逗号分割） */
    @ApiModelProperty(value = "身份证复印件（文件表ID，多个用英文逗号分割）; ", name = "idCopy")
    @Length(max = 1024)
    private String idCopy;

    /** 证件照（1寸） */
    @ApiModelProperty(value = "证件照（1寸）; ", name = "idPhoto")
    @Length(max = 1024)
    private String idPhoto;

    /** 预入职员工工号 */
    @ApiModelProperty(value = "预入职员工工号; ", name = "userCode")
    private String userCode;

    /** 预入职员工姓名 */
    @NotBlank(message = "预入职员工姓名不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "预入职员工姓名; ", name = "userName")
    private String userName;

    /** 预入职员工姓名拼音 */
    @NotBlank(message = "预入职员工姓名拼音不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "预入职员工姓名拼音; ", name = "userNamePinyin")
    private String userNamePinyin;

    /** 身高（cm）;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "身高（cm）; 仅工人必填其他均不采集", name = "bodyHeight")
    private Double bodyHeight;

    /** 体重（kg）;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "体重（kg）; 仅工人必填其他均不采集", name = "bodyWeight")
    private Double bodyWeight;

    /** 预入职员工手机号码 */
    @NotBlank(message = "预入职员工手机号码不能为空")
    @Length(max = 11)
    @Pattern(regexp = "^\\d{11}$", message = "联系方式必须为11位手机号")
    @ApiModelProperty(value = "预入职员工手机号码; ", name = "phone")
    private String phone;

    /** 预入职员工个人邮箱 */
    @NotBlank(message = "预入职员工个人邮箱不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "预入职员工个人邮箱; ", name = "emailPerson")
    private String emailPerson;

    /** 预入职员工证件号码 */
    @NotBlank(message = "预入职员工证件号码不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "预入职员工证件号码; ", name = "idCard")
    private String idCard;

    /** 出生日期 */
    @NotNull(message = "出生日期不能为空")
    @ApiModelProperty(value = "出生日期; ", name = "birthdate")
    private LocalDate birthdate;

    /** 出生地 */
    @ApiModelProperty(value = "出生地; ", name = "birthPlace")
    @Length(max = 100)
    private String birthPlace;

    /** 出生国家编码 */
    @ApiModelProperty(value = "出生国家编码; ", name = "birthCountryCode")
    @Length(max = 85)
    private String birthCountryCode;

    /** 出生国家名称 */
    @ApiModelProperty(value = "出生国家名称; ", name = "birthCountryName")
    @Length(max = 50)
    private String birthCountryName;

    /** 出生省份编码 */
    @ApiModelProperty(value = "出生省份编码; ", name = "birthProvinceCode")
    @Length(max = 85)
    private String birthProvinceCode;

    /** 出生省份名称 */
    @ApiModelProperty(value = "出生省份名称; ", name = "birthProvinceName")
    @Length(max = 50)
    private String birthProvinceName;

    /** 证件生效日期 */
    @NotNull(message = "证件生效日期不能为空")
    @ApiModelProperty(value = "证件生效日期; ", name = "docEffectiveDate")
    private LocalDate docEffectiveDate;

    /** 证件失效日期 */
    @NotNull(message = "证件失效日期不能为空")
    @ApiModelProperty(value = "证件失效日期; ", name = "docExpirationDate")
    private LocalDate docExpirationDate;

    /** 国家/地区编码;除工人不采集外均必填 */
    @NotBlank(message = "预入职员工国家/地区编码不能为空")
    @ApiModelProperty(value = "国家/地区编码; 除工人不采集外均必填; code = COUNTRY_NAME", name = "countryCode")
    @Length(max = 85)
    private String countryCode;

    /** 国家/地区名称;除工人不采集外均必填 */
    @NotBlank(message = "预入职员工国家/地区名称不能为空")
    @ApiModelProperty(value = "国家/地区名称; 除工人不采集外均必填", name = "countryName")
    @Length(max = 50)
    private String countryName;

    /** 民族编码 */
    @NotBlank(message = "民族编码不能为空")
    @Length(max = 85)
    @ApiModelProperty(value = "民族编码; code = NATION", name = "nationalityCode")
    private String nationalityCode;

    /** 民族名称 */
    @NotBlank(message = "民族名称不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "民族名称; ", name = "nationalityName")
    private String nationalityName;

    /** 籍贯名称;在4种入职类型中均采集但非必填 */
    @ApiModelProperty(value = "籍贯名称; 在4种入职类型中均采集但非必填", name = "nativeplaceName")
    @Length(max = 50)
    private String nativeplaceName;

    /** 户口性质编码 */
    @NotBlank(message = "户口性质编码不能为空")
    @Length(max = 85)
    @ApiModelProperty(value = "户口性质编码; code = HOUSEHOLD_REGISTRATION_NATURE", name = "characterrprCode")
    private String characterrprCode;

    /** 户口性质名称 */
    @NotBlank(message = "户口性质名称不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "户口性质名称; ", name = "characterrprName")
    private String characterrprName;

    /** 户口所在地 */
    @Length(max = 100)
    @ApiModelProperty(value = "户口所在地; ", name = "permanReside")
    private String permanReside;

    /** 户口所在地省份编码 */
    @NotBlank(message = "户口所在地省份编码不能为空")
    @Length(max = 85)
    @ApiModelProperty(value = "户口所在地省份编码; code = PROVINCE_CODE", name = "permanResideProvinceCode")
    private String permanResideProvinceCode;

    /** 户口所在地省份名称 */
    @NotBlank(message = "户口所在地省份名称不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "户口所在地省份名称; ", name = "permanResideProvinceName")
    private String permanResideProvinceName;

    /** 户口地址详情 */
    @NotBlank(message = "户口地址详情不能为空")
    @Length(max = 100)
    @ApiModelProperty(value = "户口地址详情; ", name = "permanResideDetail")
    private String permanResideDetail;

    /** 居住地省份编码 */
    @NotBlank(message = "居住地省份编码不能为空")
    @Length(max = 85)
    @ApiModelProperty(value = "居住地省份编码; code = PROVINCE_OF_RESIDENCE", name = "homeAddrProvinceCode")
    private String homeAddrProvinceCode;

    /** 居住地省份名称 */
    @NotBlank(message = "居住地省份名称不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "居住地省份名称; ", name = "homeAddrProvinceName")
    private String homeAddrProvinceName;

    /** 居住地详址 */
    @NotBlank(message = "居住地详址不能为空")
    @Length(max = 100)
    @ApiModelProperty(value = "居住地详址; ", name = "homeAddrDetail")
    private String homeAddrDetail;

    /** 第一次参加工作时间;除大学生非必填外均必填 */
    @ApiModelProperty(value = "第一次参加工作时间; 除大学生非必填外均必填", name = "joinWorkDate")
    private LocalDate joinWorkDate;

    /** 婚姻状况编码;在4种入职类型中均采集但非必填 */
    @ApiModelProperty(value = "婚姻状况编码; 在4种入职类型中均采集但非必填; code = MARITAL_STATUS", name = "maritalCode")
    @Length(max = 85)
    private String maritalCode;

    /** 婚姻状况名称;在4种入职类型中均采集但非必填 */
    @ApiModelProperty(value = "婚姻状况名称; 在4种入职类型中均采集但非必填", name = "maritalName")
    @Length(max = 50)
    private String maritalName;

    /** 子女数目;在4种入职类型中均采集但非必填 */
    @ApiModelProperty(value = "子女数目; 在4种入职类型中均采集但非必填", name = "kidsCount")
    private Integer kidsCount;

    /** 政治面貌编码;在4种入职类型中均采集但非必填 */
    @ApiModelProperty(value = "政治面貌编码; 在4种入职类型中均采集但非必填; code = POLITICAL_STATUS", name = "polityCode")
    @Length(max = 85)
    private String polityCode;

    /** 政治面貌名称;在4种入职类型中均采集但非必填 */
    @ApiModelProperty(value = "政治面貌名称; 在4种入职类型中均采集但非必填", name = "polityName")
    @Length(max = 50)
    private String polityName;

    /** 目前工作单位（名称）;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "目前工作单位（名称）; 仅工人必填其他均不采集", name = "currentEmployerName")
    @Length(max = 50)
    private String currentEmployerName;

    /** 缴纳保险类型枚举多选（1-养老、2-医疗、3-失业、4-工伤、5-生育、6-其他保险、无）;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "缴纳保险类型多选（1-养老、2-医疗、3-失业、4-工伤、5-生育、6-其他保险、无），逗号,分割; 仅工人必填其他均不采集", name = "siType")
    private String siType;

    /** 推荐人姓名;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "推荐人姓名; 仅工人必填其他均不采集", name = "referrerName")
    @Length(max = 50)
    private String referrerName;

    /** 推荐人工号;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "推荐人工号; 仅工人必填其他均不采集", name = "referrerUserCode")
    @Length(max = 50)
    private String referrerUserCode;

    /** 推荐人单位名称;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "推荐人单位名称; 仅工人必填其他均不采集", name = "referrerDeptName")
    @Length(max = 50)
    private String referrerDeptName;

    /** 劳务公司（代招正式工）下拉名称;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "劳务公司（代招正式工）下拉名称; 仅工人必填其他均不采集", name = "laborCompanyName")
    @Length(max = 50)
    private String laborCompanyName;

    /** 应聘部门名称;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "应聘部门名称; 仅工人必填其他均不采集", name = "appliedDeptShortName")
    @Length(max = 50)
    private String appliedDeptShortName;

    /** 应聘部门全称;仅工人必填其他均不采集 */
    @ApiModelProperty(value = "应聘部门全称; 仅工人必填其他均不采集", name = "appliedDeptFullName")
    @Length(max = 100)
    private String appliedDeptFullName;

    /** 信息采集链接通知预入职员工方式（枚举英文逗号分隔，1-短信，2-邮箱，3-飞书，4-站内信，示例：1,2代表短信和邮箱） */
    @ApiModelProperty(value = "信息采集链接通知预入职员工方式（枚举英文逗号分隔，1-短信，2-邮箱，3-飞书，4-站内信，示例：1,2代表短信和邮箱）; ", name = "notificationMethods")
    @Length(max = 50)
    private String notificationMethods;

    /** 预入职类型枚举（1-工人、2-校招、3-社招、4-高招等） */
    @NotNull(message = "预入职类型枚举（1-工人、2-校招、3-社招、4-高招等）不能为空")
    @ApiModelProperty(value = "预入职类型枚举（1-工人、2-校招、3-社招、4-高招等）; ", name = "preEmpType")
    private PreEmpTypeEnum preEmpType;

    /** 对应流程单号 */
    @ApiModelProperty(value = "对应流程单号; ", name = "bizId")
    @Length(max = 50)
    private String bizId;

    /** 北森ID（北森来源的数据需必存该字段，非北森数据用-1标识） */
    @NotBlank(message = "北森ID（北森来源的数据需必存该字段，非北森数据用-1标识）不能为空")
    @Length(max = 50)
    @ApiModelProperty(value = "北森ID（北森来源的数据需必存该字段，非北森数据用-1标识）; ", name = "bsId")
    private String bsId;

    /** 数据来源类型，1-来源于北森系统，2-来源非北森系统 */
    @NotBlank
    @Length(max = 50)
    @ApiModelProperty(value = "数据来源类型，1-来源于北森系统，2-来源非北森系统; ", name = "sourceType")
    private String sourceType;

    // 方法：通过getter方法名获取字段名
    public static String getFieldNameByGetter(Method getterMethod) {
        String methodName = getterMethod.getName();
        String fieldName;
        if (methodName.startsWith("get")) {
            fieldName = methodName.substring(3);
        } else if (methodName.startsWith("is") && getterMethod.getReturnType().equals(boolean.class)) {
            fieldName = methodName.substring(2);
        } else {
            return null;
        }
        // 将首字母转换为小写，得到字段名
        fieldName = Character.toLowerCase(fieldName.charAt(0)) + fieldName.substring(1);
        return fieldName;
    }

}